package main

import "fmt"

/**
Channel的循环遍历 与 关闭
for range 循环取值 需要close(chanName)
否则 fetal error: all goroutines are asleep -deadlock!
*/

func main() {

	allChanCat := make(chan interface{}, 10)
	allChanCat <- cat{Name: "小花", Color: "Red"}
	allChanCat <- 1
	allChanCat <- "girl"

	close(allChanCat) // 管道关闭之后，不能再写入  否则报错 panic: send on closed channel

	// 正确方法1
	//for val := range allChanCat {
	//	fmt.Println(val)
	//}

	// 错误的示范，allChanCat信道 取值之后len会变化
	//for i := 0; i < len(allChanCat); i++ {
	//	fmt.Println(<-allChanCat)
	//}

	// 正确方法2
	for {
		val, ok := <-allChanCat
		if !ok { // 有数据则返回ok
			break
		}
		fmt.Println(val)
	}

}

type cat struct {
	Name  string
	Color string
}
